package com.gl.glcourses.services.impl;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.gl.glcourses.repository.IVotacionCursoRepository;
import com.gl.glcourses.repository.IVotoRepository;
import com.gl.glcourses.services.IVotoServices;
import com.gl.glcourses.vos.Confirmacion;
import com.gl.glcourses.vos.Votacion;
import com.gl.glcourses.vos.VotacionCurso;
import com.gl.glcourses.vos.Voto;
import com.gl.glcourses.vos.constants.Constants;

@Service
@RemotingDestination(channels = { "my-amf" })
@Transactional
public class VotoServices implements IVotoServices{

	protected final Log logger = LogFactory.getLog(getClass());

	@Autowired
	IVotoRepository repoVoto;
	
	@Autowired
	IVotacionCursoRepository repoVotacionCurso;
	
	@SuppressWarnings("unchecked")
	@Override
	public Confirmacion agregarVoto(Voto voto) throws Exception{
		
		Confirmacion confirmacion = new Confirmacion();
		VotacionCurso votacionCurso = (VotacionCurso)repoVotacionCurso.findById(voto.getVotacionCurso().getId(),VotacionCurso.class);
		
		String nombreVotacion = voto.getVotacion().getNombreVotacion();
		String nombreCurso = voto.getVotacionCurso().getCurso().getNombre();
		String nombreUsuario = voto.getUsuario().getNombre();
		
		Voto votoBuscado = (Voto) repoVoto.buscarVoto(nombreVotacion,nombreCurso,nombreUsuario);
	
		if(votoBuscado==null){
			repoVoto.saveVotoAndUpdate(voto);		
			votacionCurso.addVoto();
			votacionCurso.addPuntuacion(voto.getPuntuacion());
		}else{
			votacionCurso.updatePuntuacion(votoBuscado.getPuntuacion(),voto.getPuntuacion());
			votoBuscado.setPuntuacion(voto.getPuntuacion());
			votoBuscado.setComentario(voto.getComentario());
			repoVoto.saveUpdate(votoBuscado);
		}
		
		repoVotacionCurso.save(votacionCurso);
		confirmacion.setEstado(Constants.CONFIRMACION_OK);
		
		return confirmacion;
	}

	@Override
	public List<Voto> buscarVotos(Votacion votacion) throws Exception {
		return (List<Voto>)repoVoto.buscarVotos(votacion);
	}
	
	public List<Voto> listarVotosUsuario(String nombreUsuario) throws Exception {
		return (List<Voto>)repoVoto.bucarVotosUsuario(nombreUsuario);
	}
	
}